//****************************************************************
// Autor:   Gustavo Castro
//       
// Seccion: 10
// Nombre del Archivo: Entrada.java
// Fecha de Modificacion: 
// Descripcion: Clase creada por mi. 
// Aquí se instancian las clases de huffmanTree, VectorHeap.
// Se codifica y decodifica la palabra ingresada por el usuario
// ***************************************************************

package hojatrabajo6;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Scanner;

/**
 *
 * @author cristian
 */
public class Entrada {
    String cadena;
    String binNum;
    String temporal, resp;
    Scanner teclado=new Scanner(System.in);
    Map<String,Integer> map = new HashMap<String,Integer>();       
    int lenght;
    int contador;
    
    
    // Ingreso de cadena a codificar
    public void ingreso()
    {
        System.out.println("Ingrese cadena");
        cadena=teclado.next();
    }
    // Ingreso de cadena a decodificar
    public void numeros(){
        System.out.println("Ingrese mensaje (debe ingresar 0's y 1's)");
        binNum=teclado.next();        
    }
    // Proceso de decodificacion de los 0's y 1's
    public void decodificacion(huffmanTree arbol){  
      temporal = "";

      // Se recorre la cadena binaria ingresada por el usuario
      for(int i=0;i<binNum.length();i++)
      {
          temporal+=binNum.charAt(i);
          if(arbol.map.containsKey(temporal)){
             for(Map.Entry<String,String> entry: arbol.map.entrySet()) 
             {
                 if(entry.getKey().equals(temporal))
                     System.out.print(entry.getValue());
             }
              temporal = "";
          }
      }                
    }            
    // Retorna longitud de cadena de la cadena
    public int cantidad()
    {
        lenght=cadena.length();
        return lenght;
    }
    
    // Método utilizado para colocar los caracteres de la cadena con
    // su respectiva frecuencia en un HashMap
    public void letras()
    {
        for(int i=0;i<cantidad();i++)
        {
           contador=0;
           for(int j=0;j<cantidad();j++)
           {
             if(i!=j)
             {
               if((cadena.charAt(i)==cadena.charAt(j))&&(cadena.charAt(i)!=' '))
                 contador++;
             }             
           }
           map.put(String.valueOf(cadena.charAt(i)), contador+1);           
           cadena.replace(cadena.charAt(i), ' ');           
        }
    }
    
    // Se imprimen los caracteres con su respectiva codificacion
    // Ademas se solicita una cadena binaria al usuario para decodificar
    public void imprime(){
        VectorHeap trees = new VectorHeap();
        for(Map.Entry<String,Integer> entry: map.entrySet() ) 
        {
            leaf tmp = new leaf(entry.getKey().charAt(0));
            tmp.frequency=entry.getValue();
            trees.add(new huffmanTree(tmp));
        }   
        while (trees.isGreater(1))
        {
            huffmanTree smallest = (huffmanTree)trees.remove();
            huffmanTree small = (huffmanTree)trees.remove();
            trees.add(new huffmanTree(smallest,small));

        }
        Iterator ti = trees.it();
        huffmanTree encoding = (huffmanTree)ti.next();
        
        do{
        encoding.print();     
        numeros();
        decodificacion(encoding);
        System.out.println();
        System.out.println("Ingrese 's' si desea ingresar otra cadena binaria o presione cualquier tecla para salir (Luego Enter)");               
        resp=teclado.next();        
        }
        while(resp.equals("s"));        

    }
               
}
